package com.ply.service.impl;

import com.ply.entity.vo.Result;
import com.ply.mapper.LevelMapper;
import com.ply.service.LevelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * @author XiaoPan
 * date: 2022/1/5 14:43
 * <p>
 * action: 等级对象
 */
@Slf4j
@Service
public class LevelServiceImpl implements LevelService {
    @Autowired
    LevelMapper levelMapper;

//    UserServiceImpl userService = new UserServiceImpl();

    //判断是否可以升级

    /**
     * 判断是否可以升级
     *
     * @param levelId   等级id
     * @param allAmount 总金额
     * @return
     */
    public Result isToUp(int levelId, double allAmount) {
        if (levelMapper.selectLevelis(levelId) == null) {
            return Result.fail("没有这个等级");
        }
        if (allAmount < 0) {
            return Result.fail("金额错误");
        }
        //根据等级id 去数据库 查询 下一等级 需要的金额  返回 double 类型
        if (levelId == levelMapper.selectMaxLevelId()) {
            return Result.fail("等级已满，不能升级");
        }

        Map<String, Integer> map = new HashMap<>();
        int level = levelId + 1;
        int num;
        double amount = selectAmount(level);
        if (allAmount < amount) {
            return Result.fail("充值金额不足，不能升级");
        }

        while (allAmount >= amount) {
            if (level == levelMapper.selectMaxLevelId()) {
                num = selectSendVoteSum(level) - selectSendVoteSum(levelId);
                map.put("levelId", level);
                map.put("num", num);
                return Result.ok(map);
            }
            amount = selectAmount(level + 1);
            if (allAmount < amount) {
                break;
            }
            level++;
            //可以升级  返回 增加的投票数量
        }

        num = selectSendVoteSum(level) - selectSendVoteSum(levelId);
        map.put("levelId", level);
        map.put("num", num);

        log.info("用户等级: {}", level);
        return Result.ok(map);
        //return Result.fail("升级失败");
    }

    /**
     * 根据等级id查找购买一天要多少钱，返回价格price
     *
     * @param levelId
     * @return
     */
    public double selectOneDayPrice(int levelId) {
        double price = levelMapper.selectOneDayPriceByLevelId(levelId);
        log.info("price:{}" , price);
        return price;
    }

    /**
     * 根据等级id查找购买一次投票要多少钱,返回价格price
     *
     * @param levelId
     * @return
     */
    public double selectOneVotePrice(int levelId) {
        return levelMapper.selectOneVotePriceByLevelId(levelId);
    }

    /**
     * 根据等级ID查看对应等级需要的金额，将对应的金额返回
     *
     */
    public double selectAmount(int levelId) {
        return levelMapper.selectAmountByLevelId(levelId);
    }

    /**
     * 查看对应等级能创建多少次投票，返回能投票的数量
     *
     */
    public int selectSendVoteSum(int levelId) {
        return levelMapper.selectSendVoteSum(levelId);
    }

    /**
     * 购买 次数
     * 根据等级ID和要购买几次来计算总的价钱，返回需要的价钱
     *
     * @param levelId        等级id
     * @param dayOrVoteCount 次数
     */
    public double buyVoteNumMoney(int levelId, int dayOrVoteCount) {
        return selectOneVotePrice(levelId) * dayOrVoteCount;
    }

    /**
     * 购买 day 天数
     * 根据等级id和购买几天来计算总价格，返回总价格
     *
     * @param levelId        等级id
     * @param dayOrVoteCount 次数
     */
    public double buyDayMoney(int levelId, int dayOrVoteCount) {
        return selectOneDayPrice(levelId) * dayOrVoteCount;
    }
}
